
#include "init.h"
#include <stdlib.h>


int pocet=0;

char temp2[5];
;
int tep;
int oxidace;



char *pole="{<100.0,98.0,37.0,N>";  



 
int nacteniRamce()
{
	
	
	
	
	if(dataUART==0)		// Mame data nebo este nic neprislo
	{
		if(!(strlen(temp)==0) 	// Mame data
		{							
			if(temp[10]=='<')
			{
				return 1;
			}
			return 0;
		}
	}	
	
	return 0;

	

}

 void mameData(int smer)
{
	if(smer==1)
	{
		PORTD|=(1<<PD4);
	}
	else
	{
		PORTD &=(0<<PD4);
	}
}

void mameDataSPI(int b)
{
	if(b==1)
	{
		PORTD|=(1<<PD5);
	}
	else
	{
		PORTD &=(0<<PD5);
	}
}
/* Pri zmene komunikace */
void zmenaPinu()
{
	DDRD|=(1<<PD5);
	PORTD&=(0<<PD5);
}
int vyhodnoceni()
{
	 int znak[50],i,prumer;
	 ADMUX=0x44; 
	 prumer=0;  

     for(i=0;i<50;i++)		// 50 vzorku
	 {
	    znak[i]=prevod();
        _delay_ms(t1);
		prumer+=znak[i];
	}
	prumer=prumer/50;
	if (prumer>(0x300)) 
	{
		return 1;
	}
	else
		ADCSRA&=(0<<ADEN);
		return 0;
	
}
/* Rozhodnuti o generaci alarmu */
void alarm(void)
{
	int suma=0;
	vlajka=0;
	PORTB &= ~(_BV(PB0));
	for(int i=0;i<12;i++)
	{
		suma=suma+vyhodnoceni();
		if(vlajka==1)
		{
			break;
		}
	}
	if((suma>10)||(vlajka==1))
	{	
		PORTB |= _BV(PB0);
		_delay_ms(3000);			// Cekame tri vteriny - doufame, ze se pohyb ustali
	}
	else
	{
		_delay_ms(5000);		// Alarm - cekame 5s na moznost zruseni
		if(vlajka==0)
		{
			zaznam.pad='A';
			PORTD &= ~(_BV(PD2));
		}
	}
	
   
}

void zapisData(char namerenaData[])
{
	if(mod==1)
	{
		zapisSPI(namerenaData);
		mameData(0);
	}
	else
	{
		zapisUART(namerenaData);
		mameDataSPI(0);
	}
}
/* Test na potvrzeni prijmu dat */
int dataOK()
{
	if(mod==0)
	{
		_delay_ms(300);
	 	if (~(PIND & (1<<PD2)))
		{
			return 0;
		}
		else
		{
			return 1;
		}
	}
	return 1;
}
/* Odeslani dat */
void zapis(int volba,char a[],char start, char konec)
{
	mod=0;
	if(pouzijSPI==1)
	{
		initSPIport();		// Z SPI.c
		mod=1;
		zmenaPinu();
		mameDataSPI(1);
	}
	mameData(1);
		if(volba==0)
		{
			zapisData(pole);
		}
		else
		{
			zapisZnak(start);
			zapisData(a);			
			zapisZnak(konec);
			if(dataOK())
			{
				sei();
			}
			else
			{
				zapisZnak('<');
				zapisData(a);			
				zapisZnak('>');
				sei();
			}
		}
	zaznam.tep=0;
	zaznam.oxidace=0;
	zaznam.teplota=0;
	citac=255;	
}

 
 /* TEst komunikace */
void testSpojeni()
{
	 zapis(0,pole,'<','>');
	 _delay_ms(300);
	 if (~(PIND & (1<<PD2)))
	{
		zapis(0,pole,'<','>');
	}
}

void dataOdeslat()
{
	char docas[17];
	char mezi[5];
	sprintf(mezi,"%lf",zaznam.tep);
	strcat(docas, mezi);
	sprintf(mezi,"%lf",zaznam.oxidace);
	strcat(docas, mezi);
	sprintf(mezi,"%lf",zaznam.teplota);
	strcat(docas, mezi);
	docas[16]=zaznam.pad;
	zapis(1,docas,'<','>');
	
	
}
/* Ulozeni dat do struktury */
void ulozitData()
{
	zaznam.tep+=tep;
	zaznam.oxidace+=oxidace;
	pocet++;		// Inkrementace poctu
	if(pocet==60)		// Nahodit ze mame data DTR nebo pin
	{
		zaznam.tep=zaznam.tep/pocet;
		zaznam.oxidace=zaznam.oxidace/pocet;
		zaznam.teplota=zaznam.teplota/zaznam.prubeh;
		zaznam.prubeh=0;
		pocet=0;
		if(mod==0)
		{
			cli();
			dataOdeslat();
		}
	}
}
void alarm2(int zdroj,char problem[])
{
	cli();
	if(zdroj==0)
	{
		temp[4]='T';
		zapis(1,temp2,'!','!');
	}
	else
	{
		temp[4]='O';
		zapis(1,temp2,'!','!');
	}
}
/* Metoda na kontrolu dat */
void kontrolaDat()
{
	
	if(strlen(temp)==0)
	{
		pocet++;
		return;
	}
	strncpy(temp,temp2,5);
	tep=atoi(temp2);

	if((tep>120)||(tep<50))
	{
		alarm2(0,temp2);
	}
	
	for(int i=5;i<10;i++)
	{
		temp2[i-5]=temp[i];
	}
	oxidace=atoi(temp2);
	if(oxidace<90)
	{
		alarm2(1,temp2);
	}
	temp[0]='\0';
	ulozitData();
	
}

